/**
 * DAOMessage.java 25/04/2012
 */

package l3.info.Projet.Serveur;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import l3.info.Projet.Client.Message;
import l3.info.Projet.Utilitaires.Configuration;
import l3.info.Projet.Utilitaires.DialogueBD;

/**
 * Permet d'accéder à la base de données ayant pour relation
 * un Message
 * @author Loïc Martinez
 * @version 1.0
 */

public class DAOMessage {
    /** Permet de charger la configuration de la base de données */
    private static Configuration conf = new Configuration(
            "configServer.properties");

    /** La connexion à la base de données */
    private static Connection conn = null;

    /**
     * Constructeur par défaut
     */
    public DAOMessage() {
        conn = conn == null ? DialogueBD.connexionSQL(
                "jdbc:postgresql://localhost"
                        + (conf.valueOf("port").equals("") ? "" : ":")
                        + conf.valueOf("port")
                        + "/" + conf.valueOf("database"),
                        conf.valueOf("user"), conf.valueOf("password"))
                        : conn;
    }

    /**
     * Renvoie tous les messages pour un utilisateur
     * @param numUtilisateur, le numéro de l'utilisateur
     * @param message, le message à écrire
     * @param table, la table des messages
     */
    public void ecrireMessage(int numUtilisateur, String message,
            String table) {
        // idmessage, message, numutilisateur, datecreation
        try {

            // Création de la date actuelle
            Calendar now = Calendar.getInstance();

            // On construit la date à insérer dans la base de données
            String dateNow = now.get(Calendar.DAY_OF_MONTH) + "/"
                    + now.get(Calendar.MONTH) + "/" + now.get(Calendar.YEAR) 
                    + " " + now.get(Calendar.HOUR_OF_DAY) + ":"
                    + now.get(Calendar.MINUTE)
                    + ":" + now.get(Calendar.SECOND);

            // Pour faire le Insert Into du message, aller récupérer
            // le nombre de messages total puis faire +1
            // pour le nouvel IdMessage
            int numMessage = DialogueBD.countSQL(conn, table,
                    "idmessage") + 1;

            message = message.replaceAll("'", "''");

            // On insère le message dans la base de données
            DialogueBD.insertInto(conn, table, numMessage + ", " +"'"
                    + message + "' " + ", " + numUtilisateur + ", "
                    + "'" + dateNow + "'");

        } catch (SQLException ex) {
            // Erreur SQL DaoMessage
            System.err.println("Problème ecrireMessage !");
        }
    }

    /**
     * Renvoie tous les messages pour un utilisateur
     * @param numUtilisateur, le numéro de l'utilisateur
     * @param table, la table des messages
     * @return tous les messages contenus dans une List
     */
    public List<Message> getMessages(int aPartir, int nbMessages, int myId,
            String table) {
        
        List<Message> messages = new ArrayList<Message>();
        
        try {

            String requete = 
                    "SELECT message, heureCreation "
                    + "FROM " + table + " "
                    + "WHERE numUtilisateur = " + myId + " "
                    + "LIMIT " + nbMessages + " OFFSET " + aPartir + ";";
            
            // Exécution de la requête
            Statement state = conn.createStatement();
            ResultSet result = state.executeQuery(requete);

            // Un résultat trouvé
            while (result.next()) {
                messages.add(new Message(
                        result.getString("message").replaceAll("''", "'"),
                        result.getDate("heureCreation")));
            }

            result.close();
            state.close();

            return messages;

        } catch (SQLException ex) {
            // Erreur SQL DaoMessage
            //System.err.println("Problème getMessages !");
            return null;
        }
    }
}
